﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ProgramacionRedes {
    public partial class FrmCliente : Form {
        Cliente cliente;

        public FrmCliente() {
            InitializeComponent();
            cliente = new Cliente();
            cliente.IpLocal = ProgramacionRedes.Properties.Settings.Default.IPLocal;
            cliente.PuertoLocal = ProgramacionRedes.Properties.Settings.Default.PuertoLocal;
            cliente.IpRemota = ProgramacionRedes.Properties.Settings.Default.IPRemota;
            cliente.PuertoRemoto = ProgramacionRedes.Properties.Settings.Default.PuertoRemoto;
            cliente.evConectadoChanged += new dlg_Conectado(cliente_evConectadoChanged);
            cliente.evLogChanged += new dlg_Log(cliente_evLogChanged);
            cliente.evSesionChanged += new dlg_EnSesion(cliente_evSesionChanged);
        }

        void cliente_evSesionChanged(object sender, EventArgs_EnSesion e) {
            if (lbl_Sesion.InvokeRequired) {
                this.BeginInvoke(new dlg_EnSesion(cliente_evSesionChanged), e);
            } else {
                if (e.SesionIniciada) {
                    lbl_Sesion.Text = "Sesión iniciada";
                    lbl_Sesion.BackColor = Color.DarkGreen;
                } else {
                    lbl_Sesion.Text = "Sesión NO iniciada";
                    lbl_Sesion.BackColor = Color.DarkRed;
                }
            }
        }

        void cliente_evLogChanged(object sender, EventArgs_Log e) {
            if (lbx_Log.InvokeRequired) {
                this.BeginInvoke(new dlg_Log(cliente_evLogChanged), this, e);
            } else {
                lbx_Log.Items.Add(e.Texto);
            }
        }

        void cliente_evConectadoChanged(EventArgs_Conectado conctado) {
            if (lbl_Estado.InvokeRequired) {
                this.BeginInvoke(new dlg_Conectado(cliente_evConectadoChanged), conctado);
            } else {
                if (conctado.Conectado == enuEstadoConexion.Conectado) {
                    lbl_Estado.Text = "Conectado";
                    lbl_Estado.BackColor = Color.DarkGreen;
                } else {
                    lbl_Estado.Text = "Desconectado";
                    lbl_Estado.BackColor = Color.DarkRed;
                }
            }
        }

        private void btn_Configuracion_Click(object sender, EventArgs e) {
            FrmConfiguracion frm = new FrmConfiguracion(cliente);
            frm.Show(this);
            cliente.IpLocal = ProgramacionRedes.Properties.Settings.Default.IPLocal;
            cliente.PuertoLocal = ProgramacionRedes.Properties.Settings.Default.PuertoLocal;
            cliente.IpRemota = ProgramacionRedes.Properties.Settings.Default.IPRemota;
            cliente.PuertoRemoto = ProgramacionRedes.Properties.Settings.Default.PuertoRemoto;
        }

        private void FrmPrincipal_FormClosing(object sender, FormClosingEventArgs e) {
            if (cliente.EstadoConexion == enuEstadoConexion.Conectado) {
                cliente.Terminar();
            }
        }

        private void pbx_BorrarLog_Click(object sender, EventArgs e) {
            lbx_Log.Items.Clear();
        }

        private void btn_Conectar_Click(object sender, EventArgs e) {
            try {
                cliente.Iniciar();
            } catch (Exception exc) {
                MessageBox.Show(exc.Message);
            }
        }

        private void btn_Desconectar_Click(object sender, EventArgs e) {
            try {
                cliente.Terminar();
            } catch (Exception exc) {
                MessageBox.Show(exc.Message);
            }
        }

        private void btn_IniciarSesion_Click(object sender, EventArgs e) {
            try {
                if (cliente.EstadoConexion == enuEstadoConexion.NoConectado) {
                    DialogResult res = MessageBox.Show("No está conectado. ¿Quiére conectarse?", "¡Atención!", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    if (res == DialogResult.Cancel) {
                        return;
                    } else if (res == DialogResult.Yes) {
                        cliente.Iniciar();
                    }
                }
                Login login = new Login(ProgramacionRedes.Properties.Settings.Default.Nombre, ProgramacionRedes.Properties.Settings.Default.Clave, false);
                FrmLogin frm = new FrmLogin(login);
                frm.ShowDialog(this);
                if (!login.Cancelado) {
                    cliente.Nombre = login.NombreUsuario;
                    cliente.Clave = login.Clave;
                    cliente.IniciarSesion();
                    btn_ActualizarListaAmigos_Click(this, null);
                }
            } catch (Exception exc) {
                MessageBox.Show(exc.Message);
            }
        }

        private void btn_CerrarSesion_Click(object sender, EventArgs e) {
            try {
                cliente.CerrarSesion();
            } catch (Exception exc) {
                MessageBox.Show(exc.Message);
            }                                                                             
        }

        private void btn_ActualizarListaAmigos_Click(object sender, EventArgs e) {
            lbx_AmigosBloqueados.Items.Clear();
            lbx_AmigosNoBloqueados.Items.Clear();
            try {
                List<string> amigos;
                amigos = cliente.ObtenerAmigosBloqueados();
                foreach (string s in amigos) {
                    lbx_AmigosBloqueados.Items.Add(s);
                }
                amigos = cliente.ObtenerAmigosNoBloqueados();
                foreach (string s in amigos) {
                    lbx_AmigosNoBloqueados.Items.Add(s);
                }
            } catch (Exception exc) {
                MessageBox.Show(exc.Message);
            }
        }

        private void btn_SolicitarAmistad_Click(object sender, EventArgs e) {
            TextBox valor = new TextBox();
            FrmInputBox frm = new FrmInputBox("Nombre del usuario que la recibirá:", "Solicitud de amistad", valor);
            frm.ShowDialog(this);
            if (valor.Text != "") {
                try {
                    cliente.AgregarAmigo(valor.Text);
                    btn_ActualizarListaAmigos_Click(this, null);
                } catch (Exception exc) {
                    MessageBox.Show(exc.Message);
                }
            }
        }

        private void btn_BloquearAmigo_Click(object sender, EventArgs e) {
            if (lbx_AmigosNoBloqueados.SelectedIndex < 0) {
                MessageBox.Show("Seleccione un amigo");
            } else {
                string amigo = (string)lbx_AmigosNoBloqueados.Items[lbx_AmigosNoBloqueados.SelectedIndex];
                try {
                    cliente.BloquearAmigo(amigo);
                    btn_ActualizarListaAmigos_Click(this, null);
                } catch (Exception exc) {
                    MessageBox.Show(exc.Message);
                }
            }
        }

        private void btn_DesbloquearAmigo_Click(object sender, EventArgs e) {
            if (lbx_AmigosBloqueados.SelectedIndex < 0) {
                MessageBox.Show("Seleccione un amigo");
            } else {
                string amigo = (string)lbx_AmigosBloqueados.Items[lbx_AmigosBloqueados.SelectedIndex];
                try {
                    cliente.DesbloquearAmigo(amigo);
                    btn_ActualizarListaAmigos_Click(this, null);
                } catch (Exception exc) {
                    MessageBox.Show(exc.Message);
                }
            }    
        }

        private void btn_NoBloqueadoVerEstados_Click(object sender, EventArgs e) {
            if (lbx_AmigosNoBloqueados.SelectedIndex < 0) {
                MessageBox.Show("Seleccione un amigo");
            } else {
                string amigo = (string)lbx_AmigosNoBloqueados.Items[lbx_AmigosNoBloqueados.SelectedIndex];                    
                FrmEstados frm = new FrmEstados(cliente, amigo);
                frm.Show();
            }  
        }

        private void btn_BloqueadoVerEstados_Click(object sender, EventArgs e) {
            if (lbx_AmigosBloqueados.SelectedIndex < 0) {
                MessageBox.Show("Seleccione un amigo");
            } else {
                string amigo = (string)lbx_AmigosBloqueados.Items[lbx_AmigosBloqueados.SelectedIndex];                      
                FrmEstados frm = new FrmEstados(cliente, amigo);
                frm.Show();
            }    
        }
    }
}
